zk-SNARKs Overview
zk-SNARKsとは
Zero-Knowledge Succinct Non-Interactive Argument of Knowledge
proverとverifier間で対話を必要としないゼロ知識証明の亜種。
Zero-knowledge
ゼロ知識証明
数学的な命題が真であることを伝えるのに、「真であること」以外何の知識も伝えずに証明する手法
4+s1+s2=15となるinputのs1、s2を明らかにせずにoutputが正しいことを証明する
s1とs2として何が入力されたかは分からないけど、上記の式はちゃんと満たしていることが証明される。
Succinct
proofの検証が数ミリ秒(とか)で可能
Non-interactive
ProverとVerifierでの非対話性
「SNARKs」の名付け論文
ベースプロトコルはピノキオプロトコル
Zcashが主導で開発
Txのvalid or notを送信するだけの秘匿化チェーン
zk-SNARKs on Ethereum
Byzantiumでbn256Add, bn256ScalarMul, bn256Pairingの追加
https://gyazo.com/b48904355602c70a145f355cb004bc1a
block.number >= CONSTANTINOPLE_FORK_BLKNUM
gethにおけるbn256演算をcloudflareのライブラリに変更したら改善
parityにおけるbn256ライブラリ
OK。testing頑張っていき。
code:add.sol
/// @return the sum of two points of G1
function add(G1Point p1, G1Point p2) internal returns (G1Point r) {
bool success;
assembly {
success := call(sub(gas, 2000), 6, 0, input, 0xc0, r, 0x60)
// Use "invalid" to make gas estimation work
switch success case 0 { invalid }
}
require(success);
call(g, a, v, in, insize, out, outsize)
SNARKsを用いたoffchain computationによるスケーリングがホットトピック
メリット
proofのサイズが小さい
デメリット
trusted setup
Provingの計算コスト
20Txの署名検証を伴うTx集約でlaptopで30秒くらい
主にハッシュ関数が厳しい
~800 constraints per hash
体のbitあたり約4.2 constarins
署名検証 ~2000 contraints
仕組みの概略
https://gyazo.com/2d5a21fcdad1923822cc48f01799c97b
https://gyazo.com/83129a24421586ec258da66b69a6a390
実際のユースケース
マークルツリーを使って複数のスロットの状態遷移を1つのトランザクションで起こすsnarks provingをオンチェーンでverifyすることでスケーリング。
https://gyazo.com/7b09fabe2e902296d59ccaea9a9bb35b
実装手段は大きく分けて2通りの考え方
vitalik model
Txデータもオンチェーンに送信することでデータの可用性を保証
マークルリーフもコントラクトでトラッキングすることになるのでユーザーは全てのbalanceデータなどを参照できる
ただ、単純にTxをsnarks provingのinputに使ってしまうとオンチェーンのverifyでも全てのtxをinputにしなくてはならず、それごとにecmulを行うことになりgasがやばくなってしまう。
on-chain scaling
複数のトランザクションを集約し1つのトランザクションをオンチェーンに送信。
snarkが署名Txにより書き換えられるマークルリーフの正当性を保証
Txを送信せずマークルルートのみをトラッキングするのではユーザーにとってデータは可用ではない。
そのマークルルート算出に用いられたTxの正当性と署名によるスロットの保証、Txによる状態遷移など、マークルルート計算の正当性はsnarkで保証されている。
最初のiterationであればスマートコントラクトからマークルルートをinputとして取得
メッセージとマッチするマークルリーフを探す
トランザクションの構成
公開鍵(x. y)
メッセージ:更新前のリーフと更新後のリーフのハッシュ値
署名(r, s)
マークルリーフは公開鍵を管理
トランザクションの公開鍵とマークルリーフの公開鍵が一致するか検証
署名が正しいか検証
新しいリーフと置き換え、新しいマークルルートを計算
これをsnarkに含められた全てのトランザクションに対して行うまで繰り返す
スケーラビリティ
verify : ~600,000gas
1つのリーフupdateに対するevent発火: 1840 gas
plasma snapp
batch auction
https://gyazo.com/188eb31c759f5c5ef6b3b8d9293a4923
0x型のDEXも同様の考え方でTx集約してsnarks provingすればスケールする。
十分な流動性がないとスケールしない
逆にprove time分遅くなる
リレイヤーの負担が増す。
proving 計算コスト
coda protocol
開発ツール
ライブラリ
libsnark: SCIPR Labが開発してるc++ライブラリ
zcashにも使われている
bellman: zCash(所属の一人)が開発してるrustライブラリ
イーサ向け
code:add.code
def main(a, b, c):
return a + b + c
harry先生
Groth16を用いた最適化
webassemblyによるブラウザ上での証明
iden3
coda
https://youtu.be/h0PUVR0s6Vg
詳しい仕組み
勉強会コメント
shuntak.icon > DIZK論文で提案されている分散証明
従来の証明生成システムはモノリシックだったが、提案手法で分散することにより証明が100倍早くなったとのこと
yudetamago.icon > zk-SNARKsの読み方は「ズィーケースナークス?」